【保姆级教程 您所在的位置:网站首页 zabbixapi -32500 【保姆级教程

【保姆级教程

2022-12-18 22:19| 来源: 网络整理| 查看: 265

一、zabbix简介及zabbix部署(zabbix 5.0 LTS版本)1.1 Zabbix简介1.1.1 Zabbix概述

Zabbix 是一款可监控网络的众多参数以及服务器、虚拟机、应用程序、服务、数据库、网站、云等的健康状况和完整性。Zabbix 使用灵活的通知机制,允许用户为几乎任何事件配置基于电子邮件的警报。这允许对服务器问题做出快速反应。Zabbix 基于存储的数据提供报告和数据可视化功能。这使得 Zabbix 成为容量规划的理想选择。

Zabbix是一款能够监控各种网络参数以及服务器健康性和完整性的软件。Zabbix使用灵活的通知机制,允许用户为几乎任何事件配置基于邮件的告警。这样可以快速反馈服务器的问题。基于已存储的数据,Zabbix提供了出色的报告和数据可视化功能。

1.1.2 zabbix特性1.1.2.1 数据收集可用性和性能采集;支持 SNMP(包括主动轮询和被动捕获)、IPMI、JMX、VMware 监控;自定义检查;按照自定义的时间间隔采集需要的数据;通过 Server/Proxy 和 Agents 来执行数据采集。1.1.2.2 灵活的阈值定义

你可以定义非常灵活的告警阈值,称之为触发器,触发器从后端数据库获得参考值。

1.1.2.3 高度可配置化告警可以根据递增计划、接收者、媒介类型自定义发送告警通知;使用宏变量可以使告警通知变得更加高效有益;自动动作包含远程命令。1.1.2.4 实时绘图

使用内置图形功能可实以将监控项绘制成图形。

1.1.2.5 WEB监控功能

Zabbix 可以追踪模拟鼠标在 Web 网站上的点击操作,来检查 Web 网站的功能和响应时间。

1.1.2.6 丰富的可视化选项能够创建可以将多个监控项组合到单个视图中的自定义图形;网络拓扑图;以仪表盘样式展示自定义聚合图形和幻灯片演示;报表;监控资源的高层次(业务)视图。1.1.2.7 历史数据存储存储在数据库中的数据;可配置的历史数据;内置数据管理机制(housekeeping)1.1.2.8 易配置将被监控设备添加为主机;主机一旦添加到数据库中,就会采集主机数据用于监控;将模板用于监控设备。1.1.2.9 模板功能在模板中分组检查;模板可以关联其他模板,获得继承。1.1.2.10 网络发现自动发现网络设备;Zabbix Agent 发现设备后自动注册;自动发现文件系统、网络接口和 SNMP OIDs 值。1.1.2.11 页面展示基于 PHP 的 Web 前端;可以从任何地方访问;您可以定制自己的操作方式;审计日志。1.1.2.12 zabbix api

Zabbix API 为 Zabbix 提供可编程接口,用于批量操作、第三方软件集成和其他用途

1.1.2.13 权限系统安全的用户身份验证;将特定用户限制于访问特定的视图。1.1.2.14 易扩展部署于被监控对象上;完美支持 Linux 和 Windows 1.1.2.15 二进制守护进程为了更好的性能和更少的内存占用,采用 C 语言编写;便于移植。1.1.2.16 适用复杂网络环境

使用 Zabbix Proxy 代理,可以轻松实现分布式远程监控。

官方给的硬件资源配置参考

下表提供了几个硬件配置参考:

规模平台CPU/内存数据库受监控的主机数量小型CentOSVirtual ApplianceMySQL InnoDB100中型CentOS2 CPU cores/2GBMySQL InnoDB500大型RedHat Enterprise Linux4 CPU cores/8GBRAID10 MySQL InnoDB 或 PostgreSQL>1000极大型RedHat Enterprise Linux8 CPU cores/16GBFast RAID10 MySQL InnoDB 或 PostgreSQL>10000

实际上,Zabbix 环境的配置非常依赖于监控项(主动)和更新间隔。 如果是进行大规模部署,强烈建议将数据库独立部署。

1.2 Zabbix 基础架构

1.2.1 zabbix server

zabbix server 是整个 Zabbix 软件的核心程序。

Zabbix Server 负责执行数据的主动轮询和被动获取,计算触发器条件,向用户发送通知。它是 Zabbix Agent 和 Proxy 报告系统可用性和完整性数据的核心组件。Server 自身可以通过简单服务远程检查网络服务(如Web服务器和邮件服务器)。

Zabbix Server是所有配置、统计和操作数据的中央存储中心,也是Zabbix监控系统的告警中心。在监控的系统中出现任何异常,将被发出通知给管理员。

基本的 Zabbix Server 的功能分解成为三个不同的组件。他们是:Zabbix server、Web前端和数据库。

Zabbix 的所有配置信息都存储在 Server 和Web前端进行交互的数据库中。例如,当你通过Web前端(或者API)新增一个监控项时,它会被添加到数据库的监控项表里。然后,Zabbix server 以每分钟一次的频率查询监控项表中的有效项,接着将它存储在 Zabbix server 中的缓存里。这就是为什么 Zabbix 前端所做的任何更改需要花费两分钟左右才能显示在最新的数据段的原因。

1.2.2 Zabbix agent

Zabbix agent 部署在被监控目标上,以主动监控本地资源和应用程序(硬盘、内存、处理器统计信息等)。

Zabbix agent 收集本地的操作信息并将数据报告给 Zabbix server 用于进一步处理。一旦出现异常 (例如硬盘空间已满或者有崩溃的服务进程),Zabbix server 会主动警告管理员指定机器上的异常。

Zabbix agents 的极高效率缘于它可以利用本地系统调用来完成统计数据的采集。

1.3 Zabbix部署1.3.1 集群环境规划

(建议至少≥2台)

主机类别主机IP系统软件部署zabbix_server10.0.0.20CentOS7.9.2009zabbix-server、zabbix-agent、MySQL、zabbix-webnode0110.0.0.21CentOS7.9.2009zabbix-agentnode0210.0.0.22CentOS7.9.2009zabbix-agent

1.3.2 准备工作-初始化系统(本文略) 查看检查服务器系统版本环境 关闭防火墙(所有节点) 关闭SELinux , 修改/etc/selinux/config文件(所有节点) 1.3.3 zabbix官网-选择版本

zabbix官方下载地址: https://www.zabbix.com/cn/download

【注意: 】 本次部署采用的是yum安装,yum源需要网络连通,此方式不适合被网络隔离且没有代理网络的内网环境,网络受限的情况需要去采用容器或者ZabbixSources源码安装更适合;源码安装在下载项旁边有部署文档连接

官网给了不同的下载方式,根据需要选择下载即可,下方会有安装教程

选择版本后完整地址如下:

https://www.zabbix.com/cn/download?zabbix=5.0&os_distribution=centos&os_version=7&db=mysql&ws=nginx1.3.4 安装部署zabbix 5.0 LTS1.3.4.1 安装zabbix官方yum源(所有节点先配置好yum源)# 所有节点 rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum clean all1.3.4.2 部署Zabbix-server【server节点】

以下操作无特殊说明均在zabbix-server节点

# zabbix-server节点 yum install -y zabbix-server-mysql zabbix-agent centos-release-scl

编辑配置文件 /etc/yum.repos.d/zabbix.repo 开启 zabbix-frontend 仓库

[zabbix-frontend] ... enabled=1 ...

安装Zabbix 前端web包

yum install -y zabbix-web-mysql-scl zabbix-nginx-conf-scl

安装mariadb数据库

yum install -y mariadb mariadb-server # 启动数据库,并配置开机自动启动 systemctl start mariadb systemctl enable mariadb # 查看3306端口 netstat -tnlp|grep 3306 tcp 0 0 0.0.0.0:3306 0.0.0.0:* LISTEN 1310/mysqld # 设置mariadb-server登录密码----****生产环境必须设置root密码**** # 本文未设置mariadb密码 [root@zabbix-server ~]# mysql_secure_installation NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! In order to log into MariaDB to secure it, we'll need the current password for the root user. If you've just installed MariaDB, and you haven't set the root password yet, the password will be blank, so you should just press enter here. Enter current password for root (enter for none): # 回车(当前root还没有密码,所以直接回车即可) OK, successfully used password, moving on... Setting the root password ensures that nobody can log into the MariaDB root user without the proper authorisation. Set root password? [Y/n] y # 是否要设置root密码,y New password: # 123456 (根据需要自定义) Re-enter new password: # 再次确认一遍密码 Password updated successfully! Reloading privilege tables.. ... Success! By default, a MariaDB installation has an anonymous user, allowing anyone to log into MariaDB without having to have a user account created for them. This is intended only for testing, and to make the installation go a bit smoother. You should remove them before moving into a production environment. Remove anonymous users? [Y/n] y # 当前有个anonymous用户,是否移除 y ... Success! Normally, root should only be allowed to connect from 'localhost'. This ensures that someone cannot guess at the root password from the network. Disallow root login remotely? [Y/n] n # 这里注意是Disallow不允许root远程登录,选 n ... skipping. By default, MariaDB comes with a database named 'test' that anyone can access. This is also intended only for testing, and should be removed before moving into a production environment. Remove test database and access to it? [Y/n] y # 是否移除test数据库 y - Dropping test database... ... Success! - Removing privileges on test database... ... Success! Reloading the privilege tables will ensure that all changes made so far will take effect immediately. Reload privilege tables now? [Y/n] y # 是否更新重载 y ... Success! Cleaning up... All done! If you've completed all of the above steps, your MariaDB installation should now be secure. Thanks for using MariaDB! # 配置完成

创建初始数据库

# mysql -uroot -p mysql> create database zabbix character set utf8 collate utf8_bin; mysql> create user zabbix@localhost identified by 'zabbix123456'; mysql> grant all privileges on zabbix.* to zabbix@localhost; mysql> quit;

导入初始架构和数据,系统将提示您输入新创建的密码。

zcat /usr/share/doc/zabbix-server-mysql*/create.sql.gz | mysql -uzabbix -p zabbix

为Zabbix server配置数据库,修改/etc/zabbix/zabbix_server.conf

# DBPassword=password 改为 DBPassword=zabbix123456 # 上面创建zabbix用户时定义的密码 # 查看配置文件 [root@zabbix-server ~]# cat /etc/zabbix/zabbix_server.conf | grep -vE "^$|^#" LogFile=/var/log/zabbix/zabbix_server.log LogFileSize=0 PidFile=/var/run/zabbix/zabbix_server.pid SocketDir=/var/run/zabbix DBName=zabbix DBUser=zabbix DBPassword=zabbix123456 SNMPTrapperFile=/var/log/snmptrap/snmptrap.log Timeout=4 AlertScriptsPath=/usr/lib/zabbix/alertscripts ExternalScripts=/usr/lib/zabbix/externalscripts LogSlowQueries=3000 StatsAllowedIP=127.0.0.1

为Zabbix前端nginx配置PHP

[root@zabbix-server ~]# vim /etc/opt/rh/rh-nginx116/nginx/conf.d/zabbix.conf, 把这2行注释打开,并定义端口 listen 80; server_name 10.0.0.20;

编辑配置文件 /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf, add nginx to listen.acl_users directive

[root@zabbix-server ~]# vim /etc/opt/rh/rh-php72/php-fpm.d/zabbix.conf # listen.acl_users = apache listen.acl_users = apache,nginx # 增加nginx # 修改前端显示时区 # 取消注释,改成Asia/Shanghai php_value[date.timezone] = Asia/Shanghai

启动服务zabbix-server zabbix-agent nginx php-fpm

[root@zabbix-server ~]# systemctl restart zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm [root@zabbix-server ~]# systemctl enable zabbix-server zabbix-agent rh-nginx116-nginx rh-php72-php-fpm1.3.4.2.1 访问初始化配置

浏览器访问,输入nginx配置的host跟port,例如10.0.0.20进入后需要安装

进入UI安装界面

点击下一步

这里是验证是否满足安装条件,我们之前修复改配置因此全部OK,直接下一步

输入数据库信息及密码:zabbix123456

注意Zabbix server是个给服务器取个名字,尽可能取的有意义,最好跟配置文件里定义的serverName相同

确认无误之后直接下一步

完成安装

登录zabbix

初始账号/密码为Admin/zabbix

成功登录后进入zabbix监控页面

至此zabbix5.0的server节点部署完毕

扩展:web页面解决中文乱码问题

# 安装字符集 yum -y install wqy-microhei-fonts # 替换linux上默认的字符集 \cp /usr/share/fonts/wqy-microhei/wqy-microhei.ttc /usr/share/fonts/dejavu/DejaVuSans.ttf1.3.4.3 部署Zabbix-agent 【node节点】

node01节点

# node01 [root@node01 ~]# yum install -y zabbix-agent [root@node01 ~]# vim /etc/zabbix/zabbix_agentd.conf [root@node01 ~]# cat /etc/zabbix/zabbix_agentd.conf |grep -vE "^$|^#" PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=10.0.0.20 #server ip # 开启被动模式 ServerActive=10.0.0.20 #不配端口默认是使用的10051,否则需要写成10.0.0.21:port # 开启主动模式 Hostname=node01 # 实际生产中配置主机名或者主机ip地址 Include=/etc/zabbix/zabbix_agentd.d/*.conf [root@node01 ~]# systemctl restart zabbix-agent

node02节点

# node02 [root@node02 ~]# yum install -y zabbix-agent [root@node02 ~]# vim /etc/zabbix/zabbix_agentd.conf [root@node02 ~]# cat /etc/zabbix/zabbix_agentd.conf |grep -vE "^$|^#" PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=10.0.0.20 # server ip # 开启被动模式 ServerActive=10.0.0.20 #不配端口默认是使用的10051,否则需要写成10.0.0.21:port # 开启主动模式 Hostname=node02 # 实际生产中配置主机名或者主机ip地址 Include=/etc/zabbix/zabbix_agentd.d/*.conf [root@node02 ~]# systemctl restart zabbix-agent

关于zabbix-server节点处的zabbix-agent

PidFile=/var/run/zabbix/zabbix_agentd.pid LogFile=/var/log/zabbix/zabbix_agentd.log LogFileSize=0 Server=10.0.0.20 # 这里可改成127.0.0.1 因为zabbix-server和zabbix-agent同主机 ServerActive=10.0.0.20 # 这里可改成127.0.0.1 Hostname=zabbix-server Include=/etc/zabbix/zabbix_agentd.d/*.conf

至此zabbix-agent节点部署完毕

1.3.4.4 web界面添加node节点主机

创建主机群组

添加主机群组

创建主机

添加主机

添加模板

Template OS Linux by Zabbix agent

node02操作同上

三台主机模板配置如下

zabbix-server额外增加了 Template App Zabbix Server模板

效果如下:

补充说明:

模板Template OS Linux by Zabbix agent 中的Zabbix agent ping这个指标检查zabbix-agent状态

至此,zabbix-server及zabbix-agent搭建完毕

以下为zabbix基本和进阶教程

二、zabbix基本使用及常用监控配置2.1 zabbix系统设置

页面导航栏找到截图所在行点击进入

根据情况修改系统设置

2.2 使用系统模板

zabbix系统自带的模板可直接应用在指定被监控主机,非常方便,但是实际生产情况下,系统自带的监控模板里默认参数未必完全符合实际需求,建议【全克隆】系统模板,修改克隆后的模板,然后应用克隆的模板,既保证系统模板的完整,方便模板复用,又满足实际需求;系统模板虽然使用方便,但是实际生产中,系统自带的监控指标可能无法满足所有监控需求,因此,生产中更多用的是自定义模板

查看指定的系统模板

全克隆系统模板

搜索克隆的模板

应用模板到主机 操作步骤 配置--》主机--》选择主机--》模板

选择模板

更新

成功添加模板效果如下图

以上是使用系统模板的基本操作

2.3 自定义模板

创建模板

查询自定义模板

引用模板--本例引用系统模板示范

主机引用自定义模板

2.4 自定义监控项2..4.1 引用系统key的自定义监控项

配置——模板——监控项——创建监控项

本例以监控网卡流量为例

上面设置的是监控网卡接收到的流量,是个累计值,我们要监控是每秒速率,因为需要进行计算,设置如下图

添加成功后,查看监控项,如下图

配置——模板——图形——创建图形

查看图形

给模板myweb增加监控项network-out 键值为net.if.out[ens33,bytes] 步骤同上

创建聚合图形

监测——聚合图形——创建聚合图形

设置聚合图形

增加一列

点击更改添加图形

更改--选择主机组--主机--图形 【此处的图形必须在创建监控项时创建相应的图形,否则选不到图形】

继续添加图形操作同上

说明: 这里演示的是在模板上添加监控项和图形,若未使用模板,直接选择主机添加监控和图形,操作步骤和操作模板是一样的

这里只介绍操作模板,是因为,模板可以在不同主机复用,而直接添加到主机的监控项和图形只能在添加的主机使用,无法复用

2.4.2 zabbix_get介绍

zabbix_get 主要用来检查自定义key是否有效,在zabbix-server端运行,需要单独安装

yum install -y zabbix-getzabbix提供一个zabbix_get工具,可以跟zabbix agent通讯获取监控信息使用方式:zabbix_get -s [agent_ip] -k [key]zabbix_get -s 10.0.0.21 -k system.hostname # 获取主机名称 zabbix_get -s 10.0.0.21 -k net.if.in[ens33,bytes] # 获取网卡流入流量zabbix agent查看所有可监控项目:zabbix_agentd -p 在agent节点查看2.4.3 常用监控项的键值

监控项的键以类似 xxx.yyy.zzz[mm,] 方式组织,xxx.yyy.zzz是键名,[mm,]为键的参数,mm表必填参数,表可选参数

net.if.collisions[if] 网络冲突数量,返回整型

http://net.if.in[if,] 网络接口上传流量统计,返回 整数。网卡流入量统计,mode:bytes(默认)/packets/errors/dropped

net.if.out[if,] 上行流量统计,返回整数。网卡流出量统计,mode:bytes(默认)/packets/errors/dropped

net.if.total[if,] 网络接口上传下载的流量总和,返回整数。网卡的进出流量统计信息总和,mode:bytes(默认)/packets/errors/dropped

net.tcp.listen[port] 检查 TCP 端口 是否处于侦听状态,返回 0 - 未侦听;1 - 正在侦听。

net.tcp.port[,port] 检查是否能将 TCP 连接到指定端口,返回 0 - 不能连接;1 - 可以连接。

net.tcp.service[service,,] 检查服务是否运行并接受 TCP 连接,返回 0 - 服务关闭;1 - 服务运行。

net.tcp.service.perf[service,,] 检查 TCP 服务的性能,当服务 down 时返回 0,否则返回连接服务花费的秒数。

service - 如下任一服务: ftp,http,https,imap,ldap,nntp,pop,smtp,ssh,tcp,telnet ip - IP 地址(默认为 127.0.0.1) port - 端口号 (默认为标准服务端口号)

net.udp.listen[port] 检查 UDP 端口 是否处于侦听状态,返回 0 - 未侦听;1 - 正在侦听。

net.udp.service[service,,] 检查服务是否运行并响应 UDP 请求,返回 0 - 服务关闭;1 - 服务运行。

net.udp.service.perf[service,,] 检查 UDP 服务的性能,当服务 down 时返回 0,否则返回连接到服务花费的秒数。

service - ntp ip - IP 地址(默认为 127.0.0.1) port - 端口号 (默认为标准服务端口号)

proc.cpu.util[,,,,,] CPU进程百分比,返回浮点值。

进程的CPU利用率百分比,name:进程名,默认所有进程;user:指定用户名,默认所有用户;type:CPU利用率类型,user/system,默认是两者;cmdline:提供命令行用以过滤,支持正则;mode:数据收集模式,avg1(默认)/avg5/avg15;zone:仅用于Solaris

proc.mem[,,,,] 进程内存,以字节为单位,返回整数

用户进程使用的内存,name:进程名(默认是全部进程) user:用户名(默认是全部用户) mode:可能的值:avg,max,min,sum (默认值) cmdline:按命令行过滤(正则表达式) memtype:进程使用的内存类型

proc.num[,,,] 进程数量,返回整数。 name:进程名称(默认是all processes) user:用户名(默认是all users) state:可选的值: all (default),run,sleep,zomb cmdline:按命令行过滤(正则表达式)

system.cpu.intr 设备的中断数,返回整数

system.cpu.load[,] CPU 负载,返回浮点数。 cpu:all (default), percpu (总负载除以在线CPU数) mode:avg1 (一分钟平均值, 默认值), avg5, avg15

system.cpu.switches 上下文的数量进行切换,它返回一个整数值

system.cpu.util[,,] CPU 使用率,返回浮点数。 cpu: 或者all(默认值) type:idle,nice,user(默认值),system (Windows系统默认值), iowait,interrupt,softirq,steal,guest,guest_nice mode:可能的值: avg1 (默认值), avg5, avg15

vfs.dev.read[,,] 磁盘读取数据,类型是sectors, operations, bytes;返回整数,类型是 sps, ops, bps则返回浮点。 device:磁盘设备 (默认为 all) type:sectors,operations,bytes,sps,ops,bps(必须指定此参数,因为各种操作系统的默认值不同) sps,ops,bps表示:[sectors/operations/bytes] per second。 mode:avg1(1分钟平均值, 默认),avg5,avg15.此参数仅支持的类型为: sps,ops,bps.

vfs.dev.write[,,] 磁盘写入数据,类型是sectors, operations, bytes;返回整数,类型是 sps, ops, bps则返回浮点。

vfs.fs.size[fs,] 磁盘容量,如果返回的是字节则是整数,如果返回的是百分比则是浮点。 fs:文件系统 mode:total(默认),free,used,pfree(剩余百分比),pused(已用百分比)

vm.memory.size[] 占字节或总百分比的内存大小它返回一个整数值,如果字节,只要百分比返回浮点值。内存大小,以字节为单位,以百分比表示。整数用于字节,浮点用于百分比。 mode:

1. total - 总内存量,默认; 2. platform-特定内存类型: active, anon, buffers, cached, exec, file, free, inactive, pinned, shared, wired; 3. user-用户级别估计使用和可用的内存量: used, pused, available, pavailable.2.4.4 自定义key的自定义监控项

zabbix agent提供了很多可监控的信息,但如果有需求,例如监控mysql等,自带的监控项无法满足我们的需求。 支持所有语言,只要能运行返回结果即可,运维常用的语言:Shell、Python

无参数自定义key有参数自定义key

可以将配置写在配置文件/etc/zabbix/zabbix_agentd.conf中,但如果都写在一个文件里会比较多比较乱,在配置文件里有Include=/etc/zabbix/zabbix_agentd.conf.d/*.conf这个配置,可以在这个文件夹下新建配置文件。

# 修改zabbix-agent配置文件 ### Option: EnableRemoteCommands - Deprecated, use AllowKey=system.run[*] or DenyKey=system.run[*] instead # Internal alias for AllowKey/DenyKey parameters depending on value: # 0 - DenyKey=system.run[*] # 1 - AllowKey=system.run[*] # # Mandatory: no AllowKey=system.run[*] # 增加此选项 允许zabbix执行远程命令 ### Option: Include # You may include individual files or all files in a directory in the configuration file. # Installing Zabbix will create include directory in /usr/local/etc, unless modified during the compile time. # # Mandatory: no # Default: # Include= Include=/etc/zabbix/zabbix_agentd.d/*.conf # 确保 包含此配置 ### Option: UnsafeUserParameters # Allow all characters to be passed in arguments to user-defined parameters. # The following characters are not allowed: # \ ' " ` * ? [ ] { } ~ $ ! & ; ( ) < > | # @ # Additionally, newline characters are not allowed. # 0 - do not allow # 1 - allow # # Mandatory: no # Range: 0-1 # Default: UnsafeUserParameters=1 # 这里必须是1 默认为0 1为允许用户使用自定义的参数 0为不允许 ### Option: UserParameter # User-defined parameter to monitor. There can be several user-defined parameters. # Format: UserParameter=, # See 'zabbix_agentd' directory for examples. # # Mandatory: no # Default: # UserParameter= # 不建议把自定义的key写在这里,等于跟主配置文件混在一起很乱 # 示例格式如下 key名称,shell脚本路径 .... # UserParameter=nginx_status[*],/etc/zabbix/zabbix_agentd.d/zabbix_nginx_status_plugin.sh "$1"

重启zabbix-agent生效配置

# 测试配置是否生效 [root@zabbix-server]# zabbix_get -s 10.0.0.21 -k system.run["ps axu|grep nginx|grep -v grep|wc -l"] 3 [root@zabbix-serve]# zabbix_get -s 10.0.0.21 -k system.run[hostname] node01 # system.run[shellcmd] 是一个很万能的key可运行shell命令,前提是上面的配置要开启才行,某些情况下,有妙用 # 既然可以执行shell命令,基本上shell能干的它都能干,当然,前提是要有权限2.4.4.1 无参数自定义key

示例 操作节点 node01

# 创建shell脚本 # vim /etc/zabbix/zabbix_agentd.d/memavailable.sh # 这里把配置文件和对应的脚本放在一个目录,方便查找 free -m | grep 'Mem:' |awk '{print $NF}' # 获取可用内存 # 授权 chmod +x /etc/zabbix/zabbix_agentd.d/memavailable.sh # 必须授权否则脚本无法执行

新增一个配置文件,并在配置文件里增加配置 格式:UserParameter=[key],[执行的命令]

# vim /etc/zabbix/zabbix_agentd.d/mem.conf UserParameter=mem.available,/etc/zabbix/zabbix_agentd.d/memavailable.sh # 重启zabbix-agent systemctl restart zabbix-agent systemctl status zabbix-agent # zabbix-server端测试key [root@zabbix-server ~]# zabbix_get -s 10.0.0.21 -k mem.available # 能获取到值说明配置成功 1589

有了key其他操作就跟引用系统key是一样的

2.4.4.2 有参数自定义key

示例 操作节点node01

创建接收参数的shell脚本

# vim /etc/zabbix/zabbix_agentd.d/memory.sh case "$1" in "total") free -m | grep 'Mem:' |awk '{print $2}' ;; "used") free -m | grep 'Mem:' |awk '{print $3}' ;; "free") free -m | grep 'Mem:' |awk '{print $4}' ;; "available") free -m | grep 'Mem:' |awk '{print $NF}' ;; *) echo "Usage: sh $0 total | used | free | available" ;; esac # 授权 chmod +x /etc/zabbix/zabbix_agentd.d/memory.sh

新增一个配置文件

# vim /etc/zabbix/zabbix_agentd.d/memory.conf # 这里key值里的[*]表示可以传参 UserParameter=memory[*],/etc/zabbix/zabbix_agentd.d/memory.sh "$1" # 说明:如果要传多个参数 示例如下 若传入的参数含有空格,最好用引号引起来,否则可能出问题 # UserParameter=memory[*],/etc/zabbix/zabbix_agentd.d/memory.sh "$1" "$2" "$3" # 重启zabbix-agent systemctl restart zabbix-agent systemctl status zabbix-agent # zabbix-server端测试key [root@zabbix-server ~]# zabbix_get -s 10.0.0.21 -k memory[total] # 能获取到值说明配置成功 1963

有了key其他操作就跟引用系统key是一样的

2.6 触发器 动作 执行远程命令

为方便演示,先在node01服务器部署nginx服务

# 安装nginx yum install -y nginx # 创建一个index.html cat > /usr/share/nginx/html/index.html

创建监控项

创建图形

添加到聚合图形

成功如下图

给myweb模板添加触发器

配置——模板——触发器——创建触发器

设触发器参数

成功添加如下

检查触发器启用状态,确保触发器已启用

在node01上停止nginx模拟nginx服务宕机

systemctl stop nginx

等待一下,查看问题

查看聚合图形

node01恢复nginx服务

systemctl start nginx

再次查看问题

再次查看图形

接下来设置动作,动作和触发器配合执行远程命令,实现目标: 当nginx服务器宕掉后,自动重启nginx服务

创建动作

配置——>动作——>触发器动作——>创建动作

配置动作执行的操作

既可以设置shell命令,也可以是设置要执行命令的shell脚本,记得要chmod +x 授权

确认配置

确认动作已启用

修改node01节点zabbix-agent配置文件

# 1 vim /etc/zabbix/zabbix_agentd.conf ### Option: EnableRemoteCommands - Deprecated, use AllowKey=system.run[*] or DenyKey=system.run[*] instead # Internal alias for AllowKey/DenyKey parameters depending on value: # 0 - DenyKey=system.run[*] # 1 - AllowKey=system.run[*] # # Mandatory: no AllowKey=system.run[*] # 必须开启此项 # 或者 开启EnableRemoteCommands=1 # Option: EnableRemoteCommands - Deprecated【 废弃的特性 ; 已弃用的功能】 # EnableRemoteCommands=1 # 这个参数当前还有效,未来会弃用推荐使用AllowKey=system.run[*] # 2 重启zabbix-agent systemctl restart zabbix-agnet # 3 检查zabbix用户 [root@node01 ~]# id zabbix uid=995(zabbix) gid=993(zabbix) 组=993(zabbix) # 4 授权sudo无密码执行命令 vim /etc/sudoers # 若非批量设置,推荐使用visudo命令设置,自带语法检查 ## Read drop-in files from /etc/sudoers.d (the # here does not mean a comment) #includedir /etc/sudoers.d zabbix ALL=(ALL) NOPASSWD: ALL # 所有的sudo 命令都不需要密码【生产环境不推荐,不安全】【推荐针对特定命令授权sudo】 # zabbix ALL=(ALL) NOPASSWD: /bin/systemctl # 仅对执行sudo systemctl 命令不需要密码 # zabbix ALL=(ALL) NOPASSWD: /bin/systemctl,/bin/cat,/bin/touch # 指定的多个命令,执行sudo 不需要密码

node01模拟nginx故障

systemctl stop nginx

原本远程命令只需执行一次就够了,在停掉nginx时没有设置sudo无密码执行命令,导致第一次二次执行远程命令失败,在第三次执行命令之前,设置了sudo无密码执行shell命令,才真正重启nginx,问题解决;结论: 如果没有设置sudo命令执行权限,远程命令即便可以执行,但是不会成功

监控图形如下

三、zabbix进阶3.1 zabbix告警3.1.1 用户组,用户,报警媒介配置

创建用户组 管理——>用户群组——>创建用户群组

设置权限

确认状态已启用

创建用户

设置用户参数

设置用户权限

检查用户启用状态

配置报警媒介

最好设置一下尝试次数和尝试时间,默认是3次间隔为10s

确认已启用并测试

测试成功才能用

至此报警媒配置好了

接下来配置邮件告警

3.1.2 邮件告警

分配报警媒介给用户

添加告警媒介

创建动作 创建触发器动作

配置动作

沿用前面的nginx实验触发器

配置恢复告警

确认信息点击添加,有修改要记得点更新

# ------------故障告警模板--------------------------- 故障问题:{EVENT.NAME} 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID} # ------------故障恢复模板--------------------------- 故障恢复:{EVENT.NAME} 恢复主机:{HOSTNAME1} 主机IP:{HOST.IP} 恢复时间:{EVENT.RECOVERY.TIME} 告警等级:{TRIGGER.SEVERITY} 告警项目:{TRIGGER.KEY1} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}

确认动作已启用

测试邮件报警 node01停掉nginx服务模拟服务宕机

systemctl stop nginx

告警邮件

恢复邮件

查看聚合图形

查看问题

本例是接着上面的实验继续做到此步,此处应该有掌声,zabbix配置远程命令可以使故障自愈

实际生产环境中,基本都是短信报警,发邮件的可能性很低,因为要及时发现和解决故障

3.1.3 zabbix微信告警

设置企业微信

3.1.3.1、注册企业微信

https://work.weixin.qq.com/wework_admin/register_wx

不复杂比较简单哦!

注册好了就可以点击进入后台管理页面

3.1.3.2、创建部门

然后选择管理员账号就可以了

3.1.3.3、创建应用

3.1.3.4、调试接口

创建好之后需要进行接口的调试,这一步主要就是测试我们之后微信可否能发成功

微信企业号接口调试工具: https://open.work.weixin.qq.com/wwopen/devtool/interface/combine

调试的时候需要两样东西

1、企业id

2、secret

企业微信团队会给你发消息,点击“前往查看”

把secret复制到电脑上

5、微信告警脚本

下面就开始编写微信告警的脚本了

# zabbix-server节点 告警脚本存放位置:/usr/lib/zabbix/alertscripts5.1、安装python3.6

因为微信告警脚本是python写的,所以需要先安装python,系统预装python版本是2.7,实践会报错找不到模块

# zabbix-server 节点 yum install -y python36 # 安装python3 pip3 install requests # 安装requests模块5.2、编写告警脚本

一定要到告警脚本目录下,把微信的告警脚本放进去,这里是我自己写的面向对象版本的py脚本,自己根据实际情况把重要字段改了下,需要修改的地方后面用#注释标明了,需要改成自己微信相关的信息

vim /usr/lib/zabbix/alertscripts/weixin.py #!/bin/python3 # encoding: utf-8 import requests import json import datetime import ntplib import re import sys # comment: zabbix接入微信报警脚本-面向对象版本 class WeixinMessage(object): def __init__(self): # 设置基础参数 corpid = 'XXXXXXXXXX' # 企业微信id 改成自己的 appsecret = 'XXXXXXXXXX' # 应用Secret 改成自己的 self.agentid = 1000002 # 应用AgentId 改成自己的 # 获取access_token 发送消息需要用到 token_url = 'https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=' + corpid + '&corpsecret=' + appsecret req = requests.get(token_url) # 发送请求 self.accesstoken = req.json()['access_token'] # 获取返回结果里的access_token # {'errcode': 0, 'errmsg': 'ok', 'access_token': 'xxxxxxxxxxx'} # print(accesstoken) self.get_time() # 获取网络时间和本地时间 self.msgsend_url = 'https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=' + self.accesstoken self.touser = sys.argv[1] # 填入userID即微信号,用@all是发给所有人,这里可以写死,为了方便脚本通用,本例使用sys.args接收zabbix传递参数其中sys.argv[1]就是touser,需要在zabbiix媒介设置的收件人与微信的userID相同 self.toparty = "2" # 发送的部门,根据自己的情况修改 def get_time(self): now = datetime.datetime.now() # 获取本地时间 fnow = now.strftime('%Y-%m-%d %H:%M:%S %A 第%j天') # 格式化时间 self.localtime = fnow print(f'本地时间是:{fnow}') def send_palin_text(self): recv = sys.argv # 获取接收到的参数 re_content = "" if len(recv) > 1: for m in range(len(recv)-1): re_content += recv[m+1] + "\n" # 汇总发送信息 message = f'[ zabbix预警 ]\n内容:\n收件人:{re_content} \n时间:{self.localtime}' # 构造消息发送格式 params = { "touser": self.touser, # 发送给谁 "toparty": self.toparty, # 发送给部门 "msgtype": "text", # 消息的类型 "agentid": self.agentid, "text": { "content": message # 发送的内容 }, "safe": 0 } self.send_message(self.msgsend_url, params) # 调用发送函数 @staticmethod def send_message(msgsend_url, params): req = requests.post(msgsend_url, data=json.dumps(params)) # 发送消息 print(req, type(req)) # f = re.findall('200', str(req)) # 匹配返回状态码 if len(f) > 0: print("发送成功") if __name__ == '__main__': weixin_send = WeixinMessage() # 实例化对象 weixin_send.send_palin_text() # 发送纯文本消息

获取touser里的用户账号:

获取Partyid:

获取Agentid:

修改完别忘了加可执行权限

chmod +x /usr/lib/zabbix/alertscripts/weixin.py5.3、脚本测试

手动测试一下发一条信息看微信能不能收到

[root@zabbix-server alertscripts]# ./weixin.py ai*** test hello weixin.py的三个参数: 收件人:S*****e 标题:test 内容:hello

能收到说明我们微信告警的脚本就没问题了,可以用了

6、配置告警媒介6.1、创建媒介类型:

6.2、配置动作

故障问题:{EVENT.NAME} 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}

故障恢复:{EVENT.NAME} 恢复主机:{HOSTNAME1} 主机IP:{HOST.IP} 恢复时间:{EVENT.RECOVERY.TIME} 告警等级:{TRIGGER.SEVERITY} 告警项目:{TRIGGER.KEY1} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}

6.3、应用到用户

然后就可以测试报警啦

7、告警测试

到客户端上把nginx服务停掉

查看问题

查看图形

附:微信告警shell版脚本

#!/bin/bash CorpID="wwdXXXXXXXXX" # 你的企业id Secret="BbXXXXXXXXX" # 你的SecretID GURL="https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=$CorpID&corpsecret=$Secret" Token=$(/usr/bin/curl -s -G $GURL |awk -F\": '{print $4}'|awk -F\" '{print $2}') # echo $Token PURL="https://qyapi.weixin.qq.com/cgi-bin/message/send?access_token=$Token" function body(){ local int agentid=1000002 # 你的agentdid local UserID="@all" # 发送的用户ID local PartyID=1 # 部门ID local Msg=$(echo "$@" | cut -d" " -f3-) # 发送给所有人 printf '{\n' printf '\t"touser": "'"$UserID"\"",\n" printf '\t"toparty": "'"$PartyID"\"",\n" printf '\t"msgtype": "text",\n' printf '\t"agentid": "'"$agentid"\"",\n" printf '\t"text": {\n' printf '\t\t"content": "'"$Msg"\""\n" printf '\t},\n' printf '\t"safe":"0"\n' printf '}\n' } /usr/bin/curl --data-ascii "$(body $1 $2 $3)" $PURL3.1.4 钉钉告警

钉钉告警与微信告警的配置过程大同小异

3.1.4.1 钉钉环境准备

1、到钉钉官网下载pc版钉钉,安装、注册、登陆:

钉钉下载地址:https://www.dingtalk.com/

创建群聊和钉钉机器人:

点击“设置说明”可以查看钉钉服务端API说明

3.1.4.2、脚本配置:

(1)、查看zabbix-server脚本存放的位置:

[root@zabbix-server ~]# grep ^AlertScriptsPath /etc/zabbix/zabbix_server.conf AlertScriptsPath=/usr/lib/zabbix/alertscripts

(2)、创建钉钉报警脚本:

vim /usr/lib/zabbix/alertscripts/dingding.py #!/bin/python3 #-*- coding: utf-8 -*- #zabbix钉钉报警 import time import hmac import hashlib import sys import base64 import urllib.parse from dingtalkchatbot.chatbot import DingtalkChatbot, FeedLink time_now = time.strftime("%Y-%m-%d %H:%M:%S") print(time_now) webhook = "https://oapi.dingtalk.com/robot/send?access_token=" \ "f782f1bd22cbf41c6fe0dff95549aa137f82420b58b33368878ab1e5bf3f1569" secret = "SEC3b093b132a2776e667d10c3ab509bb18994d77978480ec8b1a1e74f92325f95f" timestamp = str(round(time.time() * 1000)) secret_enc = secret.encode('utf-8') string_to_sign = '{}\n{}'.format(timestamp, secret) string_to_sign_enc = string_to_sign.encode('utf-8') hmac_code = hmac.new(secret_enc, string_to_sign_enc, digestmod=hashlib.sha256).digest() sign = urllib.parse.quote_plus(base64.b64encode(hmac_code)) print(f'timestamp:{timestamp}') print(f'sign:{sign}') # https://oapi.dingtalk.com/robot/send?access_token=XXXXXX×tamp=XXX&sign=XXX apiurl = f'{webhook}×tamp={timestamp}&sign={sign}' dingtk = DingtalkChatbot(apiurl, secret) # 初始化机器人 def send_text(): """第一: 发送文本--> send_text(self,msg,is_at_all=False,at_mobiles=[],at_dingtalk_ids=[],is_auto_at=True) msg: 发送的消息 is_at_all:是@所有人吗? 默认False,如果是True.会覆盖其它的属性 at_mobiles:要@的人的列表,填写的是手机号 at_dingtalk_ids:未知;文档说的是"被@人的dingtalkId(可选)" is_auto_at:默认为True.经过测试,False是每个人一条只能@一次,重复的会过滤,否则不然,测试结果与文档不一致 """ recv = sys.argv re_content = "" if len(recv) > 1: for m in range(len(recv)-1): re_content += recv[m+1] +"\n" content = f'{re_content} \n{time_now}' dingtk.send_text(content, is_at_all=False) def send_image(): """第二:发送图片 send_image(self, pic_url): pic_url: "图片地址" """ dingtk.send_image("docker_logo.jpeg") def send_link(): """第三:发送link send_link(self, title, text, message_url, pic_url='') title:标题 text:内容,太长会自动截取 message_url:跳转的url pic_url:添加的图片的url(可选) """ dingtk.send_link(title="今天是星期8", text="牵你的手,朝朝暮暮,牵你的手,等待明天,牵你的手,走过今生,牵你的手,生生世世", message_url="https://baidu.com", pic_url="https://qq.com") def send_markdown(): """第四:发送markdown send_markdown(self,title,text,is_at_all=False,at_mobiles=[],at_dingtalk_ids=[],is_auto_at=True) title:标题 text:内容 is_at_all: @所有人时:true,否则为:false(可选) at_mobiles: 被@人的手机号(默认自动添加在text内容末尾,可取消自动化添加改为自定义设置,可选) at_dingtalk_ids: 被@人的dingtalkId(可选) is_auto_at: 是否自动在text内容末尾添加@手机号,默认自动添加,可设置为False取消(可选) """ dingtk.send_markdown(title="我是标题", text="#### 杭州天气 @150XXXXXXXX \n> 9度,西北风1级,空气良89,相对温度73%\n> " "![screenshot](https://img.alicdn.com/tfs/TB1NwmBEL9TBuNjy1zbXXXpepXa-2400-1218.png)\n" "> ###### 10点20分发布 [天气](https://www.dingtalk.com) \n", is_at_all=True) def send_image_url(): # send_feed_card(links) """ links是一个列表a,列表里每个元素又是列表b 列表b的属性: title:标题 message_url:点开后跳转的URL pic_url:图片的地址 Returns: """ feedlink1 = FeedLink(title="猫1", message_url="https://www.badiu.com/", pic_url="http://rrd.me/gE9zB") feedlink2 = FeedLink(title="猫2", message_url="https://www.badiu.com/", pic_url="http://rrd.me/gE9zN") feedlink3 = FeedLink(title="猫3", message_url="https://www.badiu.com/", pic_url="http://rrd.me/gE9zV") feedlin4k = FeedLink(title="猫4", message_url="https://www.badiu.com/", pic_url="http://rrd.me/gE92a") links = [feedlink1, feedlink2, feedlink3, feedlin4k] dingtk.send_feed_card(links) if __name__ == '__main__': send_text() # send_image() # send_link() # send_markdown() # send_image_url() # 需要安装第三方库 pip3 install requests pip3 install dingtalkchatbot

(3)、赋予脚本执行权限和创建日志文件:

①、脚本赋予可执行权限:

[root@zabbix-server alertscripts]# chmod +x dingding.py

②、创建日志文件:

[root@zabbix-server alertscripts]# touch /var/log/zabbix/dingding.log [root@zabbix-server alertscripts]# chown zabbix.zabbix /var/log/zabbix/dingding.log

(4)、手动测试脚本是否可以正常发送消息:

①、测试命令:

[root@zabbix-server alertscripts]# ./dingding.py admin 钉钉告警测试 "这是一条测试信息" dingding.py的三个参数: 收件人: admin # 这里为了通用,可以是钉钉号,也可以是其他内容 标题: 钉钉告警测试 内容: 这是一条测试信息

在ZabbixServer上查看发送消息日志:

[root@zabbix-server alertscripts]# cat /var/log/zabbix/dingding.log3.1.4.3 zabbix web 界面设置:

钉钉告警设置跟微信告警设置过程一样

触发器触发"动作"——>特定的"报警媒介"——>单个用户的账号或用户组中用户的账号

1、创建报警媒介:

脚本参数:

{ALERT.SENDTO} #对应脚本中的,user=sys.argv[1](发给钉钉群中哪个用户)。 {ALERT.SUBJECT} #代表发送的信息的标题,subject=sys.argv[2]在"报表"的"动作日志"中可以看到。 {ALERT.MESSAGE} #对应脚本中的,text=sys.argv[3](发送的报警内容)。

2、创建报警动作,将报警发送给Admin用户:

(1)创建动作

(2)添加触发器,添加上文环境准备的触发器

(3)分别添加告警操作和恢复操作

(4)添加告警操作

"主题"对应"钉钉告警"媒介中的:{ALERT.SUBJECT}

"消息"对应"钉钉告警"媒介中的:{ALERT.MESSAGE}

主题: 故障名称(触发器名称):{EVENT.NAME} 消息: 告警主机:{HOSTNAME1} 告警时间:{EVENT.DATE} {EVENT.TIME} 告警等级:{TRIGGER.SEVERITY} 告警信息: {TRIGGER.NAME} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}

(5)添加恢复操作

(6)恢复操作配置详情

主题:故障恢复:{EVENT.NAME} 消息: 恢复主机:{HOSTNAME1} 恢复时间:{EVENT.DATE} {EVENT.TIME} 主机IP:{HOST.IP} 告警项目:{TRIGGER.KEY1} 问题详情:{ITEM.NAME}:{ITEM.VALUE} 当前状态:{TRIGGER.STATUS}:{ITEM.VALUE1} 事件ID:{EVENT.ID}

(7)点击添加

给Admin用户添加报警媒介:

"收件人"对应"钉钉告警"中的:{ALERT.SENDTO}

特别注意:这里只需要添加钉钉群里的任何一个成员的钉钉账号即可,即添加一个收件人,这样在机器人群里成员都能看到告警信息.

如果添加多个收件人,则机器人群里就会发送多个告警信息,一个收件人发一条信息.

3.1.4.4 报警测试:

(1)、nginx 服务停止告警: ①、停止nginx服务:

②、服务故障告警信息:

(2)、nginx 服务恢复告警:

3.2 zabbix自动发现 自动注册3.2.1 自动发现定义zabbix server主动去发现所有的客户端,然后将客户端的信息,登记在服务端的机器上。 缺点: zabbix-server压力会较大 例如:定义了一段地址 100~200 ,耗时较久、压力较大

添加自动发现规则

启用动作,开启自动发现设备后添加到主机群

启用动作

3.2.2 自动注册定义zabbix agent主动上报自己的信息,发给zabbix-server 缺点:agent可能找不到server(配置文件写错了,网络不通)

监测日志

1.服务端 tail -f /var/log/zabbix/zabbix_server.log 2.客户端 tail -f /var/log/zabbix/zabbix_agentd.log

等待一段时间后自动注册成功

3.3 zabbix参数优化

一、Zabbix服务端的常用参数如下:**(参数取值根据服务器配置)**

参数必填范围默认值描述CacheSizeno128K-8G8M缓存大小, 单位字节. 用于存储主机、监控项、触发器数据的共享内存大小.服务器分配有4G设置为:CacheSize=256MCacheUpdateFrequencyno1-360060Zabbix 缓存更新频率, 单位秒.60秒感觉太快了设置为:CacheUpdateFrequency=180DebugLevelno0-53指定调试等级: 0 - Zabxxi进程起停的基本信息 1 - 重要信息 2 - 错误信息 3 - 警告信息 4 - 调试 (产生大量信息) 5 - 扩展调试 (产生更多信息)HistoryCacheSizeno128K-2G16M历史缓存数据大小, 单位字节. 存储历史数据.设置为:HistoryCacheSize=64MHistoryIndexCacheSizeno128K-2G4M历史索引缓存大小, 单位字节. 用于索引历史缓存中历史数据的共享内存大小.缓存一个item大概需要索引的大小为100字节.item代表一个监控项,按照100000个监控项来算:100000*100/1024/1024=9.6M设置为:HistoryIndexCacheSize=10MHousekeepingFrequencyno0-241Zabbix 执行 housekeeping 的频率 (单位小时). 从数据库中删除过期的信息. *注意*: 为了防止 housekeeper 过载 (例如, 当历史和趋势周期大大减小时), 对于每一个item,不会在一个housek周期内删除超过4倍HousekeepingFrequency 的过时信息. 因此, 如果 HousekeepingFrequency 是 1, 一个周期内不会删除超过4小时的过时信息 (starting from the oldest entry) .StartPollersUnreachableno0-10001不可达主机 (包括IPMI 和 Java)的轮询器实例数量。设置为:StartPollersUnreachable=20占总数20%足够StartPollersno0-10005轮询器实例数量。根据具体情况设置大小设置为:StartPollers=30StartDiscoverersno0-2501自动发现子进程实例个数。设置为:StartDiscoverers=5StartTrappersno0-10005trappers进程实例数量。 Trappers接受来自Zabbix发送者、主动agents和主动proxies的传入连接。 至少要运行一个trapper进程来显示前端的服务器可用性和视图队列。设置为:StartTrappers=15StartVMwareCollectorsno0-2500vmware 采集器的子进程实例个数,如果有虚拟机的话,记得开启。Timeoutno1-303agent, SNMP 设备或外部检查的超时时长(单位秒)。设置为:Timeout=6TrendCacheSizeno128K-2G4M趋势缓存的大小,单位字节。 用于存储趋势数据的共享内存大小。设置为:128MValueCacheSizeno0,128K-64G8M历史数据缓存大小, 单位bytes. 缓存item历史数据请求的共享内存大小. 0即禁止缓存 (不建议). 当缓存大小超过共享内存时,每5分钟会向服务器日志写入一条警告信息. 设置为:ValueCacheSize=128M

二、Zabbix报错信息处理

1、Zabbix poller processes more than 75% busy:

2、 icmp pinger processes more than 75% busy

3、zabbix unreachable poller processes more than 75 busy

4、zabbix的WEB界面刷新卡死

`5、数据库连接超出```

这类报错比较多,首先检查zabbix-server配置信息

StartPollers、StartDiscoverers、StartPingers、StartPollersUnreachable等等,根据上面的【Zabbix服务端的常用参数】核对下。

然后在检查:

根据服务器性能状态、队列、数据库配置信息3.4 zabbix-api调用

api 应用程序编程接口。是一些预先定义的函数,或指软件系统不同组成部分衔接的约定 。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程的能力,而又无需访问原码,或理解内部工作机制的细节

操作系统向编程人员提供了“程序与操作系统的接口,简称程序接口,又称应用程序接口 API(Application Programming Interface)。 该接口是为程序员在编程时使用的,系统和应用程序通过这个接口,可在执行中访问系统中的资源和取得 OS 的服务,它也是程序能取得操作系统服务的惟一途径。大多数操作系统的程序接口是由一组系统调用(system call)组成,每一个系统调用都是一个能完成特定功能的子程序 。

Zabbix API由许多名义上分组的独立API方法组成。每个方法执行一个特定任务

大多数API至少包含四种方法: get, create, update 和 delete ,分别是检索,创建,更新和删除数据,但是某些API提供一套完全不同的一组方法。

示例

3.4.1 获取令牌

验证:在访问Zabbix中的任何数据之前,你需要登录并获取身份验证令牌。

编辑脚本,运行来获取身份验证令牌: vim zabbix-api.sh

curl -s -XPOST -H 'Content-Type: application/json-rpc' -d ' { "jsonrpc":"2.0", "method":"user.login", "params":{ "user": "Admin", "password": "zabbix" }, "id":1, "auth":null }' http://10.0.0.20/zabbix/api_jsonrpc.php | python -m json.tool # 参数说明: jsonrpc - API使用的JSON-RPC协议的版本; Zabbix API实现的JSON-RPC版本是2.0; method - 被调用的API方法名; params - 将被传递给API方法的参数; id - 请求的任意标识符; auth -用户认证令牌; 因为我们还没有一个,它的设置null。 http://10.0.0.20/zabbix/api_jsonrpc.php # 前端是httpd是此链接 http://10.0.0.20/api_jsonrpc.php # 前端是nginx是本链接

给文件执行权限:

[root@zabbix-server ~]# chmod +x zabbix-api.sh

运行脚本获得身份验证令牌:

[root@zabbix-server ~]# ./zabbix-api.sh { "id": 1, "jsonrpc": "2.0", "result": "b4405f68587b25c62446da4ad53ab380" # 这个就是token值 } # 响应对象又包含以下属性: jsonrpc - JSON-RPC协议的版本; result - 方法返回的数据; id - 相应请求的标识符。 # ===========获取 API 版本========= curl -s -X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "apiinfo.version", "params": [], "id": 1 }' http://10.0.0.20/api_jsonrpc.php | python -m json.tool3.4.2 查询主机

我们现在有一个有效的用户身份验证令牌,可以用来访问Zabbix中的数据。 例如,让我们使用 host.get 方法检索所有已配置主机的ID,主机名和接口 : 只需要修改:zabbix-api.sh 脚本内容

# ===========检索主机========= curl -s -X POST -H 'Content-Type:application/json' -d ' { "jsonrpc": "2.0", "method": "host.get", "params": { "output": [ "hostid", "host" ], "selectInterfaces": [ "interfaceid", "ip" ] }, "id": 1, "auth": "b4405f68587b25c62446da4ad53ab380" }' http://10.0.0.20/api_jsonrpc.php | python -m json.tool3.4.3 删除主机:

使用 host.delete 方法删除指定的主机

curl -s -XPOST -H 'Content-Type: application/json-rpc' -d ' { "jsonrpc": "2.0", "method": "host.delete", "params": [ "10416" ], "id": 1, "auth": "b4405f68587b25c62446da4ad53ab380" }' http://10.0.0.20/api_jsonrpc.php |python -m json.tool

[root@zabbix-server]# ./zabbix-delete.sh { "id": 1, "jsonrpc": "2.0", "result": { "hostids": [ "10416" ] } }

3.4.4 添加主机:vim zabbix-addhost.sh curl -s -XPOST -H 'Content-Type: application/json-rpc' -d ' { "jsonrpc": "2.0", "method": "host.create", "params": { # 主机名 "host": "10.0.0.21", "interfaces": [ { "type": 1, "main": 1, "useip": 1, # 主机ip "ip": "10.0.0.21", "dns": "", # 端口 "port": "10050" } ], "groups": [ { # 主机组 "groupid": "19" } ], "tags": [ { # 打标签 "tag": "10.0.0.21", # 标签值 "value": "10.0.0.21" } ], # 选择模板 "templates": [ { "templateid": "10418" } ], "inventory_mode": 0 }, "auth": "b4405f68587b25c62446da4ad53ab380", "id": 1 } ' http://10.0.0.20/api_jsonrpc.php |python -m json.tool

# chmod +x zabbix-addhost.sh [root@zabbix-server]# ./zabbix-add.sh { "id": 1, "jsonrpc": "2.0", "result": { "hostids": [ "10426" ] } }

3.4.5 更新主机vim zabbix-updatehost.sh curl -s -XPOST -H 'Content-Type: application/json-rpc' -d ' { "jsonrpc": "2.0", "method": "host.update", "params": { "hostid": "10426", "tags": { # 更新标签 "tag": "node01", "value": "Linux-10.0.0.21" } }, "auth": "038e1d7b1735c6a5436ee9eae095879e", "id": 1 } ' http://10.0.0.20/api_jsonrpc.php |python -m json.tool # chmod +x [root@zabbix-server]# ./zabbix-updatehost.sh { "id": 1, "jsonrpc": "2.0", "result": { "hostids": [ "10426" ] } }

3.4.6 使用python调用zabbix-api# 安装第三方库 pip3 install pyzabbix

pyzabbix目前支持zabbix5.0(同时向下兼容)API的调用。所以本文采用pyzabbix实现功能

pyzabbix提供了日志功能:

日志:

import sys import logging from pyzabbix import ZabbixAPI stream = logging.StreamHandler(sys.stdout) stream.setLevel(logging.DEBUG) log = logging.getLogger('pyzabbix') log.addHandler(stream) log.setLevel(logging.DEBUG)

封装类:

#!/bin/python3 # -*- coding: utf-8 -*- # @File : zabbix-python-api.py from pyzabbix import ZabbixAPI, ZabbixAPIException import sys class Zabbix(object): def __init__(self): ZABBIX_SERVER = 'http://10.0.0.20' zapi = ZabbixAPI(ZABBIX_SERVER) zapi.login('Admin', 'zabbix') self.zapi = zapi def get_hosts(self, host): # 获取主机 host_list = self.zapi.host.get( output=['hostid', 'name', 'host'], search={'host': host} ) return host_list def add_host(self, ip, group_ids, template_ids, port=10050, dns='', useip=1, main=1, type=1): # 添加主机监控 interfaces = { "type": type, "main": main, "useip": useip, "ip": ip, "dns": dns, "port": port } if type == 2: interfaces['details'] = { 'version': 2, 'community': '{$SNMP_COMMUNITY}' } if not template_ids[0]['templateid']: template_ids=[{}] data = self.zapi.host.create( host=ip, interfaces=[interfaces], groups=group_ids, templates=template_ids ) return data def get_hostgroups(self, name): # 获取主机群组 hostgroups = self.zapi.hostgroup.get( output='extend', filter={ 'name': name } ) return hostgroups def add_hostgroups(self, name): # 添加主机群组 hostgroups = self.zapi.hostgroup.create( name=name ) return hostgroups def get_templates(self, name): # 获取主机群组 templates = self.zapi.template.get( output="extend", filter={ "name": name } ) return templates def add_item(self, host): # 添加监控项 hosts = self.zapi.host.get(filter={"host": host}, selectInterfaces=["interfaceid"]) if hosts: host_id = hosts[0]["hostid"] print("Found host id {0}".format(host_id)) try: item = self.zapi.item.create( hostid=host_id, name='Used disk space on $1 in %', key_='vfs.fs.size[/,pused]', type=0, value_type=3, interfaceid=hosts[0]["interfaces"][0]["interfaceid"], delay=30 ) except ZabbixAPIException as e: print(e) sys.exit() print("Added item with itemid {0} to host: ".format(item["itemids"][0])) else: print("No hosts found") def add_maintenance(self, name, active_since, active_till, groupids, hostids, timeperiods, description): # 创建维护期 # timeperiod_type 时间周期类型 # 0 - (default)one time only; # 2 - daily; # 3 - weekly; # 4 - monthly. # start_time 一天内维护模式开始的时刻 # period 维护模式周期的时间(秒) # dayofweek 维护模式生效的周次 # every 对于天或者周的周期every定义维护模式生效的天或者周间隔 # active_since 维护模式生效的时刻 # active_till 维护模式失效的时刻 # name 维护模式的名称 # groupids 要执行维护模式的主机组IDs # timeperiods 维护模式时间周期 maintenance = self.zapi.maintenance.create( name=name, active_since=active_since, active_till=active_till, groupids=groupids, hostids=hostids, timeperiods=timeperiods, description=description ) return maintenance def get_triggers(self, groupids=None, hostids=None): # 获取触发器标记 params = { 'output': ['triggerid', 'description'] } if groupids: params['groupids'] = groupids.split(',') if hostids: params['hostids'] = hostids.split(',') result = self.zapi.trigger.get(**params) return result def update_triggers(self, triggerid, tag, value): # 更新触发器 success_ids = [] fail_ids = [] try: self.zapi.trigger.update( triggerid=triggerid, tags=[ { 'tag': tag, 'value': value } ] ) success_ids.append(triggerid) except Exception: fail_ids.append(triggerid) return success_ids, fail_ids def time_to_stamp(date_time): # 时间转为时间戳 import time a_time = time.strptime(date_time, '%Y-%m-%d %H:%M:%S') return int(time.mktime(a_time)) if __name__ == "__main__": # 初始化实例 res = Zabbix() # 获取主机 hosts = res.get_hosts("") print(hosts) # chmod +x zabbix-python-api.py [root@zabbix-server ~]#./zabbix-python-api.py [{'hostid': '10084', 'name': 'Zabbix-server-10.0.0.20', 'host': '10.0.0.20'}, {'hostid': '10417', 'name': 'node02-10.0.0.22', 'host': '10.0.0.22'}, {'hostid': '10426', 'name': '10.0.0.21', 'host': '10.0.0.21'}]

zabbix-api更多使用方法请参数官方手册

地址: https://www.zabbix.com/documentation/5.0/zh/manual/api/reference

四、zabbix监控综合实例4.1 自定义nginx监控#!/bin/bash # #---------------------------------------------------------------------------- # Name: zabbix_nginx_status_plugin.sh # Version: v1.0 # Function: collect nginx status information # Author: aikey # Create Date: 2021-01-02 15:04:05 # Description: the script for zabbix collect nginx information # #---------------------------------------------------------------------------- HOST="127.0.0.1" PORT="80" function ping { /sbin/pidof nginx | wc -l } function active { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Active' | awk '{print $NF}' } function reading { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Reading' | awk '{print $2}' } function writing { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Writing' | awk '{print $4}' } function waiting { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| grep 'Waiting' | awk '{print $6}' } function accepts { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $1}' } function handled { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $2}' } function requests { /usr/bin/curl "http://$HOST:$PORT/nginx_status/" 2>/dev/null| awk NR==3 | awk '{print $3}' } # ----启用函数---- $1 # 修改agnet配置文件 # vim /etc/zabbix/zabbix_agentd.d/nginx_status.conf UserParameter=nginx.status[*],/etc/zabbix/zabbix_agentd.d/zabbix_nginx_status_plugin.sh "$1" # 重启agent # 测试key zabbix-server端 zabbix_get -s 10.0.0.21 -k nginx.status[ping] zabbix_get -s 10.0.0.21 -k nginx.status[accepts] zabbix_get -s 10.0.0.21 -k nginx.status[requests]

以上是nginx监控脚本及zabbix-agent配置及测试,其他的web页面操作跟前面一致,这里略

#!/bin/bash # #---------------------------------------------------------------------------- # Name: zabbix_alert.sh # Version: v1.0 # Function: send zabbix alert to ops admin # Author: aikey # Create Date: 2021-01-02 15:04:05 # Description: send zabbix alert to ops admin when alter is avticed # #---------------------------------------------------------------------------- SENDTO="$1" SUBJECT="$2" MESSAGE="$3" echo "`date +%F" "%T" "%A` $SENDTO" >> /tmp/zabbix_alert.log echo "`date +%F" "%T" "%A` $SUBJECT" >> /tmp/zabbix_alert.log echo "`date +%F" "%T" "%A` $MESSAGE" >> /tmp/zabbix_alert.log4.2 自定义mysql监控# 创建数据库用户 create user if not exist zabbix@'127.0.0.1' identified by 'zabbix123456'; # 授权 grant all on *.* to zabbix@'127.0.0.1'; # 刷新 flush privileges; #!/bin/bash # #---------------------------------------------------------------------------- # Name: zabbix_mysql_plugin.sh # Version: v1.0 # Function: monitor mysql serveice status # Author: aikey # Create Date: 2021-09-03 15:04:05 # Description: zabbix 监控 MySQL 状态 # #---------------------------------------------------------------------------- #主机 HOST="127.0.0.1" #用户 USER="zabbix" #密码 PASSWORD="zabbix123456" #端口 PORT="3306" #MySQL连接 CONNECTION="mysqladmin -h ${HOST} -u ${USER} -P ${PORT} -p${PASSWORD}" case $1 in uptime) result=`${CONNECTION} status 2>/dev/null |awk '{print $2}'` echo $result ;; questions) result=`${CONNECTION} status 2>/dev/null |awk '{print $6}'` echo $result ;; com_update) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_update" |awk '{print $4}'` echo $result ;; slow_queries) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Slow_queries" |awk '{print $4}'` echo $result ;; com_select) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_select" |awk '{print $4}'` echo $result ;; com_rollback) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_rollback" |awk '{print $4}'` echo $result ;; com_insert) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_insert" |awk '{print $4}'` echo $result ;; com_delete) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_delete" |awk '{print $4}'` echo $result ;; com_commit) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_commit" |awk '{print $4}'` echo $result ;; bytes_sent) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Bytes_sent" |awk '{print $4}'` echo $result ;; bytes_received) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Bytes_received" |awk '{print $4}'` echo $result ;; com_begin) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_begin" |awk '{print $4}'` echo $result ;; *) echo "Usage:$0(uptime | questions | com_update | slow_queries | com_select | com_rollback | com_insert | com_delete | com_commit | bytes_sent | bytes_received | com_begin)" esac # vim /etc/zabbix/zabbix_agentd.d/mysql_status.conf #获取MySQL性能指标 UserParameter=mysql.status[*],/etc/zabbix/zabbix_agentd.d/zabbix_mysql_plugin.sh $1 #获取MySQL运行状态 UserParameter=mysql.ping,mysqladmin -u root -h 127.0.0.1 -p123456 ping 2>/dev/null | grep -c alive #获取MySQL版本 UserParameter=mysql.version,mysql -V #慢查询sql数量 UserParameter=mysql.slow,export MYSQL_PWD=zabbix123456;mysql -uzabbix -h127.0.0.1 -P3306 -sN -e "select count(1) from information_schema.innodb_trx ORDER BY trx_started asc;" # 重启agent # 测试 zabbix-server端 zabbix_get -s 10.0.0.22 -k mysql.status[uptime] zabbix_get -s 10.0.0.22 -k mysql.status[questions] zabbix_get -s 10.0.0.22 -k mysql.version zabbix_get -s 10.0.0.22 -k mysql.slow4.3 nginx+mysql综合脚本#!/bin/bash # #---------------------------------------------------------------------------- # Name: zabbix_plugins.sh # Version: v1.0 # Function: monitor services like nginx,mysql and so on # Author: aikey # Create Date: 2021-09-03 15:04:05 # Description: collect servces data to zabbix # #---------------------------------------------------------------------------- SERVICE_NAME=$1 # 脚本的第一个参数,服务名称 STATUS=$2 # 脚本的第二个参数,状态 function nginx(){ # 通过启用nginx的http_stub_status_module模块获取nginx状态数据 NGINX_HOST="127.0.0.1" NGINX_PORT="80" STATUS_PATH="nginx_status" # nginx status模块配置的访问路径 NGINX_STATUS_URL="http://${NGINX_HOST}:${NGINX_PORT}/${STATUS_PATH}/" function ping() { # 获取nginx进程数 ps aux|grep nginx|grep -v grep|wc -l } function active() { # Active connections:当前处于活动状态的客户端连接数,包括连接等待空闲连接数 /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| grep 'Active' | awk '{print $NF}' } function reading() { # Reading:当前状态,正在读取客户端请求报文首部的连接的连接数。 /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| grep 'Reading' | awk '{print $2}' } function writing() { # Writing:当前状态,正在向客户端发送响应报文过程中的连接数。 /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| grep 'Writing' | awk '{print $4}' } function waiting() { # Waiting:当前状态,正在等待客户端发出请求的空闲连接数,开启 keep-alive的情况下, # 这个值等于 active – (reading+writing) /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| grep 'Waiting' | awk '{print $6}' } function accepts() { # accepts:统计总值,Nginx自启动后已经接受的客户端请求的总数。 /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| awk NR==3 | awk '{print $1}' } function handled() { # handled:统计总值,Nginx自启动后已经处理完成的客户端请求的总数 # 通常等于accepts,除非有因worker_connections限制等被拒绝的连接。 /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| awk NR==3 | awk '{print $2}' } function requests() { # requests:统计总值,Nginx自启动后客户端发来的总的请求数。刷新会增加。 /usr/bin/curl "${NGINX_STATUS_URL}" 2>/dev/null| awk NR==3 | awk '{print $3}' } case $STATUS in ping) ping ;; active) active ;; reading) reading ;; writing) writing ;; waiting) waiting ;; accepts) accepts ;; handled) handled ;; requests) requests ;; *) echo "Nginx Service Parameters: ping | active | reading | writing | waiting | accepts | handled | requests" esac } function mysql() { #mysql主机 MYSQL_HOST="127.0.0.1" #用户 USER="zabbix" #密码 PASSWORD="zabbix123456" #端口 MYSQL_PORT="3306" #MySQL连接 CONNECTION="mysqladmin -h ${MYSQL_HOST} -u ${USER} -P ${MYSQL_PORT} -p${PASSWORD}" case $STATUS in uptime) result=`${CONNECTION} status 2>/dev/null |awk '{print $2}'` echo $result ;; questions) result=`${CONNECTION} status 2>/dev/null |awk '{print $6}'` echo $result ;; com_update) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_update" |awk '{print $4}'` echo $result ;; slow_queries) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Slow_queries" |awk '{print $4}'` echo $result ;; com_select) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_select" |awk '{print $4}'` echo $result ;; com_rollback) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_rollback" |awk '{print $4}'` echo $result ;; com_insert) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_insert" |awk '{print $4}'` echo $result ;; com_delete) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_delete" |awk '{print $4}'` echo $result ;; com_commit) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_commit" |awk '{print $4}'` echo $result ;; bytes_sent) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Bytes_sent" |awk '{print $4}'` echo $result ;; bytes_received) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Bytes_received" |awk '{print $4}'` echo $result ;; com_begin) result=`${CONNECTION} extended-status 2>/dev/null |grep -w "Com_begin" |awk '{print $4}'` echo $result ;; *) echo "Mysql Service Parameters: uptime | questions | com_update | slow_queries | com_select | com_rollback | com_insert | com_delete | com_commit | bytes_sent | bytes_received | com_begin" ;; esac } case $SERVICE_NAME in nginx) nginx ;; mysql) mysql ;; *) echo -e "ServiceName: \e[1;32mnginx | mysql\e[0m" echo -e "Usage: $0 (ServiceName + Status ) Example: \e[1;32m$0 nginx ping\e[0m" echo -e "Query Status Parameters: \e[1;32m$0 nginx|mysql --help\e[0m" esac # vim /etc/zabbix/zabbix_agentd.d/myservices_status.conf #获取数据 UserParameter=myserveice.status[*],/etc/zabbix/zabbix_agentd.d/zabbix_plugins.sh "$1" "$2" #获取MySQL运行状态 UserParameter=mysql.ping,mysqladmin -u root -h 127.0.0.1 -p123456 ping 2>/dev/null | grep -c alive # 测试 zabbix_get -s 10.0.0.22 -k myserveice.status[nginx,ping] zabbix_get -s 10.0.0.22 -k myserveice.status[nginx,active] zabbix_get -s 10.0.0.22 -k myserveice.status[nginx,accepts] zabbix_get -s 10.0.0.22 -k myserveice.status[nginx,requests] zabbix_get -s 10.0.0.22 -k myserveice.status[nginx,handled] zabbix_get -s 10.0.0.22 -k mysql.ping zabbix_get -s 10.0.0.22 -k myserveice.status[mysql,uptime] zabbix_get -s 10.0.0.22 -k myserveice.status[mysql,questions] zabbix_get -s 10.0.0.22 -k myserveice.status[mysql,slow_queries]4.4 自定义tomcat监控# zabbix 5.0 监控jmx,包括java -jar 和tomcat运行的程序 环境准备: 安装zabbix-java-gateway 配置: vi /etc/zabbix/zabbix_java_gateway.conf #将以下内容取消注释并修改为如下 ... LISTEN_IP="0.0.0.0" #监控地址(默认地址) LISTEN_PORT=10052 #监听端口 PID_FILE="/var/run/zabbix/zabbix_java.pid" #进程文件路径 START_POLLERS=5 #开启的工作进程数 ... vi /etc/zabbix/zabbix_server.conf #将以下内容取消注释并修改为如下(默认的情况下,zabbix server未启用javaPollers) ... JavaGateway=10.0.0.22 #JavaGateway的地址(本机安装可使用127.0.0.1) JavaGatewayPort=10052 #JavaGateway的端口号 StartJavaPollers=5 #开启的进程数量(大于客户端的数量) ... # 重启zabbix-java-gateway systemctl restart zabbix-java-gateway systemctl restart zabbix-server # 1.tomcat # /usr/local/tomcat/bin/catalina.sh # 添加如下: # ----- Execute The Requested Command ----------------------------------------- CATALINA_OPTS="$CATALINA_OPTS -Dcom.sun.management.jmxremote \ -Djava.rmi.server.hostname=10.0.0.22 \ -Dcom.sun.management.jmxremote.port=8888 \ -Dcom.sun.management.jmxremote.ssl=false \ -Dcom.sun.management.jmxremote.authenticate=false" # 重启tomcat # 2.java # 启动加上参数: java -Dcom.sun.management.jmxremote -Djava.rmi.server.hostname=127.0.0.1 -Dcom.sun.management.jmxremote.port=12345 -Dcom.sun.management.jmxremote.ssl=false -Dcom.sun.management.jmxremote.authenticate=false -jar app.jar 参数 说明 -Dcom.sun.management.jmxremote 启用JMX -Dcom.sun.management.jmxremote.authenticate=false 是否开启认证(有需求的话可以开启认证,需定义用户名和密码) -Dcom.sun.management.jmxremote.ssl=false 是否使用 ssl -Dcom.sun.management.jmxremote.port=12345 监听端口 -Djava.rmi.server.hostname=10.0.0.22 Tomcat所在服务器 IP 地址 zabbix-server web上配置 在web界面进行设置 配置—> 主机—> node02-10.0.0.22—> 主机—> 添加JMX接口的信息(端口要和配置文件中写的一样) —> 添加 模板配置选择 Template APP Generic Java JMX 等几分钟,刷新,可以看到node02-10.0.0.22的JMX变绿五、zabbix-proxy分布式监控配置5.1 分布式监控proxy介绍

分布式proxy经常用于公司有多个机房之间进行使用,比如zabbix-server在北京的机房,还有一个机房在上海,上海的机器也要监控,如果搭建两套zabbix监控系统维护起来将非常麻烦,但是使用同一套zabbix监控系统,上海的服务器与北京的服务器也不会通信,也不能吧上海的机器全部配成公网ip。

这时zabbix proxy分布式监控就可以完美的解决这个问题,只需要在上海机房搭建一个zabbix-proxy,定期的从zabbix-server上拉取监控项即可完成监控。

zabbix-proxy可以代替zabbix server收集性能和可用性数据,然后将数据汇报给zabbix-server,并在一定程度上分担了zabbix-server的压力。

zabbix-proxy也可以解决云主机和本地机房服务器之间的监控,思路是这样的:在本地机房搭建zabbix服务器,并配置一个公网ip,在云主机上搭建zabbix-proxy服务,并在zabbix-server上添加proxy程序,就可以把阿里云的机器一并监控过来。

上图中,Proyx 仅需要一个与Zabbix服务器的TCP连接即可。这样,您只需配置一个防火墙规则,就可以轻松绕过防火墙。

注意:Zabbix代理必须使用单独的数据库。将其指向Zabbix服务器数据库将破坏配置。

代理收集的所有数据都存储在本地,然后再传输到服务器。这样,不会由于与服务器的任何临时通信问题而丢失任何数据。代理配置文件中的 ProxyLocalBuffer 和 ProxyOfflineBuffer 参数控制数据在本地保留多长时间。

zabbix proxy 是一个数据收集器,它不计算触发器、不处理事件、不发送报警。有关proxy功能的概述,如下表:

功能项目(Items)proxy支持(yes/no)Zabbix agent checksYesZabbix agent checks (active)YesSimple checksYesTrapper itemsYesSNMP checksYesSNMP trapsYesIPMI checksYesJMX checksYes日志文件监控(Log file monitoring)Yes内部检查(Internal checks)YesSSH checksYesTelnet checksYes外部检查(External checks)Yes网络发现(Network discovery)Yes自动发现(Low-level discovery)Yes触发器计算(Calculating triggers)Yes处理事件(Processing events)No发送报警(Sending alerts)No远程命令(Remote commands)NoNo

注意: 使用 agent active 模式,一定要记住在 agent 的配置文件参数 ServerActive 加上 proxy 的 IP 地址。

5.2 安装zabbix-proxy

找台新机器 10.0.0.23

rpm -Uvh https://repo.zabbix.com/zabbix/5.0/rhel/7/x86_64/zabbix-release-5.0-1.el7.noarch.rpm yum install -y zabbix-proxy-mysql5.3 数据库准备

为 Proxy 搭建单独的 MysQL 数据库服务器,并创建逻辑库、授权的用户。

# mysql -uroot -p password mysql> create database zabbix_proxy character set utf8 collate utf8_bin; mysql> create user zabbix@localhost identified by 'zabbix123456'; mysql> grant all privileges on zabbix_proxy.* to zabbix@localhost; mysql> quit;

导入初始数据

ls /usr/share/doc/zabbix-proxy-mysql*/schema.sql.gz zcat /usr/share/doc/zabbix-proxy-mysql*/schema.sql.gz | mysql -uzabbix -p zabbix_proxy5.4 配置 Zabbix Proxy

编辑 /etc/zabbix/zabbix_proxy.conf

5.4.1 为 Zabbix proxy 配置到数据库连接信息# vi /etc/zabbix/zabbix_proxy.conf DBHost=localhost DBName=zabbix_proxy DBUser=zabbix DBPassword=zabbix1234565.4.2 为 Zabbix proxy 配置到 Zabbix Server 的信息# 代理模式 0 主动上报给 Zabbix Server, 1 被动,默认 0 ProxyMode=0 Server=10.0.0.20 # Zabbix-server服务器的IP # 唯一的、区分大小写的代理名称。确保服务器知道代理名称! # 如果未定义,则从HostnameItem获取值。 Hostname=bj-proxy # 允许日志文件最大多少 MB, 默认是 0,就是不限制大小,也就是不进行日志切割 LogFileSize=2 # 即使数据已经与服务器同步,代理也会在本地保留N个小时。 #如果第三方应用程序将使用本地数据,则可以使用此参数 # 默认 0 ProxyLocalBuffer=0 # 如果没有与Zabbix服务器连接,代理将保留数据N小时。 # 旧数据将丢失。 # 默认 1 ProxyOfflineBuffer=1 # 心跳消息的频率(秒)。 #用于监控服务器端代理的可用性。 #0-已禁用心跳消息。 #对于处于被动模式的代理,此参数将被忽略。 # 默认 60 HeartbeatFrequency=60 # 向服务端更新监控配置的间隔时间 # 为了快速看到实验效果,这里设置5秒,默认3600秒 ConfigFrequency=5 # 向服务端发送监控数据的间隔时间,单位秒 DataSenderFrequency=5

更多配置项说明,请参考 官方文档-zabbix_proxy.conf

5.5 启动Zabbix Proxy 并检查systemctl start zabbix-proxy systemctl status zabbix-proxy # systemctl restart zabbix-proxy # 如果第一次连不上zabbix-server重启一次5.6 、配置被 Proxy 监控的主机# vim /etc/zabbix/zabbix_agentd.conf # Zabbix Proxy 的 IP Server=10.0.0.23 # 假如开启了 agent 的主动模式,这里也是 Zabbix Proxy 的 IP ServerActive=10.0.0.235.7、在 Zabbix Server 端添加一个 Zabbix Proxy5.7.1 页面上创建 Agent 代理

5.7.2 配置代理的相关信息

最好是添加主机后观察这里的时间,看不到时间就重启zabbix-proxy,再次观察

5.7.3、在 Zabbix Server 端添加一个 被 Proxy 监控的主机



【本文地址】

公司简介

联系我们

今日新闻

    推荐新闻

      专题文章
        CopyRight 2018-2019 实验室设备网 版权所有